# -*- coding: utf-8 -*-

"""
  @author: tangliqi
  @date: 2022/11/25 17:33
  @python version: 3.6 
  @contact me: 110
  ---------------------------------------
  @desc: python设计模式实现 => 组合模式.py
"""
from abc import abstractmethod


# 通过一个文件目录组织的例子来实现组合模式
# 组合模式将一组对象组织（Compose）成树形结构，以表示一种“部分 - 整体”的层次结构。
# 文件目录树就是这种模式的典型应用。一个目录下，既有子目录，又有文件，目录和文件都是文件系统中统一的表示。

# ============================  文件系统节点类  ============================
class FileSystemNode:
    def __init__(self, path, is_file=True):
        # 节点是否文件
        self.is_file = is_file
        # 节点的路径表示
        self.path = path
        # 节点的子节点
        self.sub_node = []

    def add_node(self, node):
        """添加子节点"""
        self.sub_node.append(node)

    def delete_node(self, node):
        """删除子节点"""
        self.sub_node.remove(node)


# ============================  抽象类  ============================
# 将目录和文件拆分成单独的类表示，对象划分更加抽象和清晰

class Node:
    def __init__(self, path):
        self.path = path


class FileNode(Node):
    def __init__(self, path):
        super().__init__(path)
        self.is_file = True


class DirNode(Node):
    def __init__(self, path):
        super().__init__(path)
        self.is_file = False
        self.sub_node = []

    def add_node(self, node: Node):
        """添加子节点"""
        self.sub_node.append(node)

    def delete_node(self, node: Node):
        """删除子节点"""
        self.sub_node.remove(node)
